package com.xinrui.sunnyday.serivce.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.xinrui.sunnyday.dao.MemberDao;
import com.xinrui.sunnyday.dao.OrderDao;
import com.xinrui.sunnyday.dao.OrderSettingDao;
import com.xinrui.sunnyday.exception.SunnydayException;
import com.xinrui.sunnyday.pojo.Member;
import com.xinrui.sunnyday.pojo.Order;
import com.xinrui.sunnyday.pojo.OrderSetting;
import com.xinrui.sunnyday.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service(interfaceClass = OrderService.class)
public class OrderServiceImpl implements OrderService {
    //    订单
    @Autowired
    private OrderDao orderDao;
    //    预约
    @Autowired
    private OrderSettingDao orderSettingDao;
    //    会员
    @Autowired
    private MemberDao memberDao;

    /**
     * 用户预约
     *
     * @param orderInfo
     * @return
     */
    @Override
    public Order submit(Map<String, Object> orderInfo)  {
//            拿到日期

//            日期格式转换
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd");
//        拿到转换后的日期
        Date DateTime = null;
        try {
            DateTime = simpleDateFormat.parse(orderInfo.get("orderDate") + "");
        } catch (ParseException e) {
//            转换未成功
            throw new SunnydayException("日期格式错误");
        }
//        1.预约操作:根据日期进行查询当天是否约满，如果约满则抛出提示
//        查询到当前预约时间的可预约数和已预约人数
        OrderSetting Setting = orderSettingDao.findMemberByTime(DateTime);
//        如果没有查到当前日期的值则抛出提示
        if (null == Setting) {
            throw new SunnydayException("当天无可预约!");
        }
//        判断如果已预约人数大于可预约人数则抛出提示
        if (Setting.getReservations() > Setting.getNumber()) {
            throw new SunnydayException("当天预约人数已满!");
        }

//      2.增加会员操作:先查询此体检人是否为会员，如果不是会员直接进行添加订单的操作，如果没有注册过则自动使用此体检人注册并成为会员
//        拿到体检人的身份证号
        String idCard = String.valueOf(orderInfo.get("idCard"));
        Member memberOne = memberDao.findMemberByName(idCard);
//        判断是否注册
        if (null == memberOne) {
//            进行自动注册会员并抛出提示(增加会员操作)
            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("name", orderInfo.get("name"));
            hashMap.put("sex", orderInfo.get("sex"));
            hashMap.put("telephone", orderInfo.get("telephone"));
            hashMap.put("idCard", orderInfo.get("idCard"));
            hashMap.put("regTime", DateTime);
            memberDao.insertMember(hashMap);
            throw new SunnydayException("您还未成为会员，系统将为您自动加入会员");
        }

//        3.生成订单:为了不重复生成订单，当体检id和日期以及套餐相同的不能进行预约，抛出提示
//                再进行查询一次数据库就可以查到当前体检人的信息，如果增加，根据程序从上而下执行原则，我这里可以查到增加后的数据
//                如果没有判断进增加则可以直接查询
        Order orders = new Order();
        //          会员id
        orders.setMemberId(memberOne.getId());
//        时间
        orders.setOrderDate(DateTime);
//        套餐id,我这里map传过来的值是obj类型所以需要先转成String再转成Integer
        Integer setmealId = Integer.valueOf(String.valueOf(orderInfo.get("setmealId")));
        orders.setSetmealId(setmealId);
//            查询是否有这三个条件都相同的数据，如果有抛出提示
        Order order = orderDao.findOrder(orders);
//           不等于空则有此订单,抛出提示
        if (null != order) {
            //8.1存在，重复：抛异常
            throw new SunnydayException("不能重复预约");
        }
//       等于空直接添加订单,默认使用微信支付
        orders.setOrderType(Order.ORDERTYPE_WEIXIN);
        orders.setOrderStatus(Order.ORDERSTATUS_NO);
        orderDao.insertOrder(orders);
        //        已预约人数小于可预约人数进行当前日期已预约人数加一(sql语句进行加一操作)
        orderSettingDao.updateOrderSetting(DateTime);
//        返回值
        return orders;
    }

    /**
     * 多表查询：查询订单信息
     *
     * @param id
     * @return
     */
    @Override
    public Map<String, Object> findById(Integer id) {
        return orderDao.findById(id);
    }
}
